繁体   English   中英

实体框架比较通用

[英]Entity Framework compare generic

众所周知,如果未将“类”限制应用于参数,则泛型不支持相等比较。 我们如何解决LINQ To Entities?

query.Where(p => p.CategoryId == categoryId); //doesn't work

我之前看到的解决方法是使用EqualityComparer.Default.Equal,但无法将其转换为SQL。

我还尝试手动构建表达式:

        var parameterExpression = Expression.Parameter(typeof(T));
        var categoryIdPropertyExpression = Expression.Property(parameterExpression, "CategoryId");
        var categoryIdExpression = Expression.Constant(categoryId);
        var equalityExpression = Expression.Equal(categoryIdPropertyExpression, categoryIdExpression);
        Expression<Func<T, bool>> lambda = Expression.Lambda<Func<T, bool>>(equalityExpression, parameterExpression);

        query = query.Where(lambda);

我的T可能长或为空。 如果T为Nullable,则此代码将引发异常,因为它可以检查long和Nullable的相等性。

是否有适用于EF的解决方法?

对我有帮助的解决方案:将ParameterId作为通用传递并更改行

var categoryIdExpression = Expression.Constant(categoryId);

var categoryIdExpression = Expression.Constant(categoryId, typeof(P));

当您使用可为空的类型时,此查询有效吗?

query.Where(p =>
    (p.CategoryId == null && categoryId == null)
    || (p.CategoryId.Value == categoryId.Value));

您的原始查询或多或少会产生以下SQL:

SELECT *
FROM [Table]
WHERE [CategoryId] = @p0

我的查询产生:

SELECT *
FROM [Table]
WHERE (([CategoryId] IS NULL) AND (@p0 IS NULL)) OR ([CategoryId] = @p0)

categoryIdnull ,第一个查询不返回结果,但是第二个查询则返回结果。

作为一种替代方法(可读性较差,但也可以使用),您可以尝试以下操作:

from p in query
join a in new [] { categoryId } on p.CategoryId equals a 
select p;

干杯。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM