在动态Linq中使用“单一”

时间:2011-01-31 10:46:29

标签: linq

我正在尝试转换我在Linq工作的Linq查询,以便能够在动态linq中工作(使用System.Linq.Dynamic),因为我希望用户能够形成自己的查询和此查询字符串将在运行时添加到其他查询字符串。

我有一个问题:

db.incidents.Where(a => a.incidentLocations.Single().location.street.Contains(location);

我尝试将其转换为以下动态linq字符串:

query = 
string.Concat("incidentLocations.Single().location.street.Contains(\"", location, "\")");

db.incidents.Where(query);

其中location是包含搜索文本的字符串。

我已经设法将我的所有其他查询转换为动态linq但是这个我正在努力解决异常错误:

“没有适用的聚合方法'单一'存在”

我理解动态linq不支持所有扩展方法,有人可能会告诉我如何解决这个问题。

3 个答案:

答案 0 :(得分:7)

获取Linq.Dynamic的源代码,复制粘贴Where方法,在方法中更改签名和带有函数名称的字符串,你就可以了。我这样做是为了添加Single First等,我不能在这里复制它,因为我不在我的开发机上,但如果有必要,我会在以后再做;)

编辑:如果你决定使用它,这是Single方法:

public static object Single(this IQueryable source)
    {
        if (source == null) throw new ArgumentNullException("source");
        return source.Provider.Execute(
            Expression.Call(
                typeof(Queryable), "Single",
                new Type[] { source.ElementType },
                source.Expression));
    }

答案 1 :(得分:3)

很抱歉找到一个非常老的帖子,但我想我可以添加一些有价值的信息!

我必须使用Linq to Entities而不是你的Linq to SQL为First()/ FirstOrDefault()执行此操作,我可以确认@ Guillaume86的解决方案确实有效!

以下是我修改MicrosoftDynamic.sql的方法: 我在静态DynamicQueryable类中添加了这个:

    public static object FirstOrDefault(this IQueryable source)
        {
            if (source == null) throw new ArgumentNullException("source");
            return source.Provider.Execute(
                Expression.Call(
                    typeof(Queryable), "FirstOrDefault ",
                    new Type[] { source.ElementType },
                    source.Expression));
        }

我还将接口IEnumerableSignatures修改为

            void FirstOrDefault();

(我使用了FirstOrDefault,因为当它不是linq中对实体的最后一次调用时,不支持First())

您可以对任何支持的功能重复此操作:)

答案 2 :(得分:0)

你试过这个吗?

db.incidents.Where(incidentLocations.Single().location.street.Contains(location));