使用「;“单一”;动态Linq

使用「;“单一”;动态Linq,linq,Linq,我正在尝试转换一个在Linq中工作的Linq查询,以便能够在动态Linq中工作(使用System.Linq.dynamic),因为我希望用户能够形成自己的查询,并且该查询字符串将在运行时添加到其他查询字符串中 我有一个问题: db.incidents.Where(a => a.incidentLocations.Single().location.street.Contains(location); 我尝试将其转换为以下动态linq字符串: query = string.Concat(

我正在尝试转换一个在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不支持所有扩展方法,有人能告诉我如何解决这个问题吗。

获取linq的源代码。动态,复制粘贴Where方法,更改签名和方法内带有函数名的字符串,就可以开始了。我这样做是为了先添加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));
    }

很抱歉挖掘了一个非常旧的线程,但我认为我可以添加一些有价值的信息

我必须对First()/FirstOrDefault()使用LINQtoEntities而不是LINQtoSQL执行此操作,我可以确认@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是因为First()不是linq中对实体的最后一个调用时不受支持)


您可以对任何受支持的函数重复此操作:)

我从未使用过动态Linq,但您是否尝试过
SingleOrDefault()
?它做的事情或多或少是一样的。只有当找不到记录时,它才会返回
null
,而不是抛出错误。我对动态Linq不太熟悉,但它是针对SQL还是对象的?也许应该是single First()?既然可以将多个Linq查询组合成一个巨型表达式,为什么要将硬编码部分转换为动态的?保持原样,然后添加额外的动态查询作为额外的过滤器或子选择?谢谢你的回答,耶,我考虑过这样做,但我认为开始修改源代码要麻烦得多。最后,我改变了dbml映射关系(其中相当复杂),以避免像Manatherin所说的那样使用single()。尽管我现在无法验证您的答案是否有效,因为我已经以不同的方式解决了问题,并且项目已经部署!谢谢你不辞辛劳地试图解决我的问题。(对不起,我没有足够的声誉来支持你。)如果你添加此方法,你还需要将Single添加到IEnumerableSignatures接口(在同一个文件中)。我很久以前问过这个问题,但现在我将其设置为答案。