我有IQueryable <>对象.
我想将它转换为List <>,其中包含选定的列IQueryable<>.
编辑
马克,你是对的!
但我只能访问FindByAll()方法(因为我的架构).
它给了我IQueryable <>中的整个对象.
我有严格的要求(为select标签创建json对象)只有list <> type with two fields.
我想在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可以有记录.我应该如何合并它们?
我需要能够在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) 在.Net 4.0上的C#的上下文中,是否有任何内置对象可以实现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>吗?一个或另一个有哪些优点/缺点?
我们发现编译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<>对象的缓存,我可以在第一次自动编译查询后调用它们.
我正在创建一个公开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) 我有存储库(例如ContactRepository,UserRepository等),它封装了对域模型的数据访问.
当我在寻找数据时,例如
生日是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,并且通过在适当的存储库中包含所有内容而失去了"良好的分组".
这真的是这样做的方式,还是有更好的方法来实现同样的目标?
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)
我在第二个查询中收到错误,如本文标题所示.我试着转换成int以nullable int,但毫无效果.帮我,伙计们.
谢谢
iqueryable ×10
c# ×8
linq ×5
linq-to-sql ×3
asp.net-mvc ×2
.net ×1
c#-4.0 ×1
datacontext ×1
interface ×1
list ×1
mocking ×1
repository ×1
rhino-mocks ×1
types ×1