标签: iqueryable

为什么使用AsQueryable()而不是List()?

我正在使用存储库模式进行数据访问,实体框架LINQ作为非测试存储库实现的基础.我看到的大多数样本在调用返回N个记录而不是List <T>时返回AsQueryable().这样做有什么好处?

c# linq iqueryable repository

55
推荐指数
3
解决办法
5万
查看次数

将IQueryable <>类型对象转换为List <T>类型?

我有IQueryable <>对象.

我想将它转换为List <>,其中包含选定的列IQueryable<>.

编辑

马克,你是对的!

但我只能访问FindByAll()方法(因为我的架构).

它给了我IQueryable <>中的整个对象.

我有严格的要求(为select标签创建json对象)只有list <> type with two fields.

c# list iqueryable

48
推荐指数
4
解决办法
11万
查看次数

如何合并两个IQueryable列表

我想在C#中合并两个IQueryable列表的记录.我试试

IQueryable<MediaType> list1 = values;
IQueryable<MediaType> list2 = values1;
obj.Concat(obj1);
Run Code Online (Sandbox Code Playgroud)

IQueryable<MediaType> list1 = values;
IQueryable<MediaType> list2 = values1;
obj.Union(obj1);
Run Code Online (Sandbox Code Playgroud)

但如果list1为空,则结果列表也为空.在我的情况下,要么list1可以是空的,但list2可以有记录.我应该如何合并它们?

c# iqueryable

47
推荐指数
2
解决办法
4万
查看次数

实例化空IQueryable以用于Linq to sql

我需要能够在Linq查询中具有可选参数,或者如果需要从查询中删除该可选参数,则能够将查询分配给类似IF的var.

如果我在IF语句中设置查询var,那么当我尝试循环时,它告诉我var在上下文中不存在.

if (whichGroup == "All")
        {
            var listOppLineData = (from o in db.opportunity_vws
                                   where o.fiscal_yr_and_qtr == qtr
                                   select o
                                  );
        }
        else
        {
            var listOppLineData = (from o in db.opportunity_vws
                                   where o.fiscal_yr_and_qtr == qtr && o.Group == whichGroup
                                   select o
                                  );
        }

        foreach (var data in listOppLineData)  //listOppLineData doesn't exist here
        {
Run Code Online (Sandbox Code Playgroud)

我需要在我认为的IF语句之前设置var,但我不知道将它设置为什么.

var listOppLineData = ""; // gives me 
Cannot implicitly convert type 'System.Linq.IQueryable<Forecast.Models.opportunity_vw>' to 'string'

IQueryable listOppLineData = new IQueryable(); //gives me
        Cannot create an instance of …
Run Code Online (Sandbox Code Playgroud)

c# linq asp.net-mvc iqueryable linq-to-sql

47
推荐指数
4
解决办法
6万
查看次数

在.Net 4.0中可以使用实现IQueryable <T>的实例化类型?

在.Net 4.0上的C#的上下文中,是否有任何内置对象可以实现IQueryable<T>

linq types interface iqueryable c#-4.0

40
推荐指数
1
解决办法
2万
查看次数

我应该从DAL返回IEnumerable <T>还是IQueryable <T>?

我知道这可能是意见,但我正在寻找最佳实践.

据我所知,IQueryable<T>实现IEnumerable<T>,所以在我的DAL中,我目前有方法签名,如下所示:

IEnumerable<Product> GetProducts();
IEnumerable<Product> GetProductsByCategory(int cateogoryId);
Product GetProduct(int productId);
Run Code Online (Sandbox Code Playgroud)

我应该IQueryable<T>在这里使用吗?

这两种方法的优点和缺点是什么?

请注意,我打算使用Repository模式,所以我将有一个这样的类:

public class ProductRepository {

    DBDataContext db = new DBDataContext(<!-- connection string -->);

    public IEnumerable<Product> GetProductsNew(int daysOld) {
        return db.GetProducts()
          .Where(p => p.AddedDateTime > DateTime.Now.AddDays(-daysOld ));
    }
}
Run Code Online (Sandbox Code Playgroud)

我应该改变我IEnumerable<T>IQueryable<T>吗?一个或另一个有哪些优点/缺点?

datacontext data-access-layer iqueryable linq-to-sql

38
推荐指数
3
解决办法
6184
查看次数

自动编译Linq查询

我们发现编译Linq查询比每次编译要快得多,所以我们想开始使用编译查询.问题是它使代码更难阅读,因为查询的实际语法在某些其他文件中是关闭的,远离它的使用位置.

在我看来,有可能编写一个方法(或扩展方法),它使用反射来确定传入的查询,并自动缓存已编译的版本以供将来使用.

var foo = (from f in db.Foo where f.ix == bar select f).Cached();
Run Code Online (Sandbox Code Playgroud)

Cached()必须反映传入的查询对象并确定所选的表和查询的参数类型.显然,反射有点慢,因此使用缓存对象的名称可能会更好(但是第一次编译查询时仍然需要使用反射).

var foo = (from f in db.Foo where f.ix == bar select f).Cached("Foo.ix");
Run Code Online (Sandbox Code Playgroud)

有没有人有这方面的经验,或者知道它是否可能?

更新:对于那些没有看过它的人,可以使用以下代码将LINQ查询编译为SQL:

public static class MyCompiledQueries
{
    public static Func<DataContext, int, IQueryable<Foo>> getFoo =
        CompiledQuery.Compile(
            (DataContext db, int ixFoo) => (from f in db.Foo
                                            where f.ix == ixFoo
                                            select f)
        );
}
Run Code Online (Sandbox Code Playgroud)

我想要做的是拥有这些Func<>对象的缓存,我可以在第一次自动编译查询后调用它们.

c# linq asp.net-mvc iqueryable linq-to-sql

36
推荐指数
1
解决办法
1万
查看次数

我如何模拟IQueryable <T>

我正在创建一个公开IQueryable的存储库.对我的单元测试进行模拟的最佳方法是什么?

由于我在其余的模拟对象中使用RhinoMocks,我尝试执行以下操作:

IQueryable<MyObject> QueryObject = 
    MockRepository.GenerateStub<IQueryable<MyObject>>();
Run Code Online (Sandbox Code Playgroud)

这不起作用,所以我尝试这样做:

IQueryable<MyObject> QueryObject = 
    (new List<MyObject> { new MyObject() }).AsQueryable();
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来做到这一点,或者有任何其他模拟框架构建支持IQueryable?

我的存储库界面如下所示:

public interface IRepository<T> where T : TableServiceEntity
{
    IQueryable<T> Table { get; }
    void Attach(T existingItem);
    void Delete(T itemToDelete);
    void Insert(T newItem);
    T Load(string partitionKey, string rowKey);
    IEnumerable<T> Load(string partitionKey);
    IEnumerable<T> Query(IQueryable<T> query);
    IEnumerable<T> Last(int count);
    T Last();
    void Update(T item);
}
Run Code Online (Sandbox Code Playgroud)

这是我要测试的方法:

public Post LoadPost(int year, int month, int day, string slug)
{
    var query = from p in _blogRepository.Table
                where …
Run Code Online (Sandbox Code Playgroud)

c# rhino-mocks iqueryable mocking

35
推荐指数
2
解决办法
2万
查看次数

存储库方法与扩展IQueryable

我有存储库(例如ContactRepository,UserRepository等),它封装了对域模型的数据访问.

当我在寻找数据时,例如

  • 找到名字以XYZ开头的联系人
  • 生日是1960年以后的联系人

    (等等),

我开始实现诸如FirstNameStartsWith(字符串前缀)YoungerThanBirthYear(int year)之类的存储库方法,基本上遵循了许多示例.

然后我遇到了一个问题 - 如果我必须结合多个搜索怎么办?我的每个存储库搜索方法(如上所述)仅返回一组有限的实际域对象.为了寻找更好的方法,我开始在IQueryable <T>上编写扩展方法,例如:

public static IQueryable<Contact> FirstNameStartsWith(
               this IQueryable<Contact> contacts, String prefix)
{
    return contacts.Where(
        contact => contact.FirstName.StartsWith(prefix));
}        
Run Code Online (Sandbox Code Playgroud)

现在我可以做一些事情

ContactRepository.GetAll().FirstNameStartsWith("tex").YoungerThanBirthYear(1960);
Run Code Online (Sandbox Code Playgroud)

然而,我发现自己正在编写扩展方法(并且发明了疯狂的类,例如全面的ContactsQueryableExtensions,并且通过在适当的存储库中包含所有内容而失去了"良好的分组".

这真的是这样做的方式,还是有更好的方法来实现同样的目标?

.net c# extension-methods iqueryable repository-pattern

33
推荐指数
3
解决办法
5264
查看次数

无法将类型'System.Linq.IQueryable <int>'隐式转换为'int?'

var cityList = from country in 
                    doc.Element("result")
                    .Element("cities")
                    .Descendants("city")
select new {
        Name = country.Element("name").Value,
        Code = country.Element("code").Value,
        CountryCode = int.Parse(country
                      .Element("countrycode")
                      .Value)
    };

foreach(var citee in cityList)
{
    City city = new City();
    city.CountryID = from cnt in db.Countries 
                     where cnt.DOTWInternalID == citee.CountryCode 
                     select cnt.ID;
}
Run Code Online (Sandbox Code Playgroud)

我在第二个查询中收到错误,如本文标题所示.我试着转换成intnullable int,但毫无效果.帮我,伙计们.

谢谢

c# linq iqueryable

31
推荐指数
4
解决办法
6万
查看次数