加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 在LINQ to Entities中返回类型约束的泛型输入类型(EF4.1)

发布时间:2020-12-15 06:18:19 所属栏目:百科 来源:网络整理
导读:我有一个简单的扩展方法,用于通过标签过滤LINQ IQueryable.我正在使用LINQ to Entities与以下界面: public interface ITaggable{ ICollectionTag Tags { get; } } 以下内容不起作用,返回IQueryable ITaggable而不是IQueryable T: public static IQueryable
我有一个简单的扩展方法,用于通过标签过滤LINQ IQueryable.我正在使用LINQ to Entities与以下界面:
public interface ITaggable
{
    ICollection<Tag> Tags { get; } 
}

以下内容不起作用,返回IQueryable< ITaggable>而不是IQueryable< T:

public static IQueryable<T> WhereTagged<T>(this IQueryable<T> set,string tag) where T:ITaggable
    {
        return set.Where(s=>s.Tags.Any(t=>t.Name.ToLower() == tag.ToLower()));
    }

这导致LINQ to Entities投放异常:

“Unable to cast the type ‘ReleaseGateway.Models.Product’ to type
‘ReleaseGateway.Models.ITaggable’. LINQ to Entities only supports
casting Entity Data Model primitive types.”
(System.NotSupportedException) A System.NotSupportedException was
caught: “Unable to cast the type ‘Project.Models.Product’ to type
‘Project.Models.ITaggable’. LINQ to Entities only supports casting
Entity Data Model primitive types.”

它没有这样的约束,但我必须在应用程序代码中显式声明类型T:

public static IQueryable<T> WhereTagged<T>(this IQueryable<ITaggable> set,string tag)
{
    return set.Where(s=>s.Tags.Any(t=>t.Name.ToLower() == tag.ToLower())).Cast<T>();
}

问题:为什么类型约束转换返回类型?我可以重写这个来利用从扩展方法调用者推断类型吗?

解决方法

我正在寻找同样的答案,不满足于提供的答案的句法清洁度,我一直在寻找并发现这篇文章.

TL;博士; – 添加类的约束,它的工作原理.

LINQ to Entities only supports casting EDM primitive or enumeration types with IEntity interface

public static IQueryable<T> WhereTagged<T>(this IQueryable<T> set,string tag)
    where T: class,ITaggable

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读