ارسال انواع بی نام (Anonymous) بازگشتی توسط Entity framework به توابع خارجی
نویسنده: مهران موسوی
تاریخ: ۱۳۹۱/۰۹/۲۱ ۱۶:۵۱
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
var context = new Models.EntitiesConnection();
var query = context.Posts.Select(pst => new {
id = pst.id,
Title = pst.Title,
GNames = pst.GroupsDetails.Select(grd => new { Name = grd.PostGroup.name })
})
.OrderByDescending(c => c.id)
.ToList();
public bool myfunc(List<Post> query)
{
foreach (var item in query)
{
..... string title = item.Title;
}
...return true;
}
.
.
.
var context = new Models.EntitiesConnection();
var queryx = context.Posts.ToList();
.... myfunc(queryx );
public static List<T> CreateGenericListFromAnonymous<T>(object obj, T example)
{
return (List<T>)obj;
}
public static IEnumerable<T> CreateEmptyAnonymousIEnumerable<T>(T example)
{
return new List<T>(); ;
}
////
public bool myfunc(object query)
{
var cquery = CreateGenericListFromAnonymous(query,
new {
id = 0,
Title = string.Empty,
GNames = CreateEmptyAnonymousIEnumerable(new { Name = string.Empty })
});
foreach (var item in cquery)
{
string title = item.Title;
foreach (var gname in item.GNames)
{
string gn = gname.Name;
}
.
.
.
}
return false;
}
.
.
.
var context = new Models.EntitiesConnection();
var query = context.Posts.Select(pst => new
{
id = pst.id,
Title = pst.Title,
GNames = pst.GroupsDetails.Select(grd => new { Name = grd.PostGroup.name })
}).OrderByDescending(c => c.id);
myfunc(query.ToList());
با تشکر. روشهای دیگری هم برای بازگشت انواع بینام و نشان وجود دارند:
- خروجی متد را object تعریف کنیم
- خروجی متد را یک لیست از نوع dynamic (سی شارپ 4) تعریف کنیم
- خروجی متد را فقط ienumerable تعریف کنیم (نیازی به ذکر t ندارد الزاما)
public bool sample(object query)
{
System.Reflection.BindingFlags flags = System.Reflection.BindingFlags.Public |
System.Reflection.BindingFlags.NonPublic |
System.Reflection.BindingFlags.Static |
System.Reflection.BindingFlags.Instance |
System.Reflection.BindingFlags.DeclaredOnly;
foreach (var item in query.GetType().GetProperties(flags))
{
string test = item.GetValue(query,null).ToString();
// Do Something ...
}
return false;
}
public static List<T> CreateGenericListFromAnonymous<T>(object obj, T example)
{
var newquery = new List<T>();
var constructor = typeof(T).GetConstructors(
System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance
).OrderBy(c => c.GetParameters().Length).First();
foreach (var item in ((IEnumerable<object>)obj))
{
var mapobj = new object[example.GetType().GetProperties().Count()];
int counter = 0;
foreach (var itemmap in example.GetType().GetProperties())
{
object value = item.GetType().GetProperty(itemmap.Name).GetValue(item, null);
Type t = itemmap.PropertyType;
mapobj[counter] = Convert.ChangeType(value, t);
counter++;
}
newquery.Add((T)constructor.Invoke(mapobj));
}
return newquery;
}
var context = new Models.EntitiesConnection();
var query = context.Posts.Select(pst => new
{
id = pst.id,
Title = pst.Title,
Likes = pst.Likes,
Unlikes = pst.Unlikes
}).OrderByDescending(c => c.id);
object test_custom_casting = CreateGenericListFromAnonymous(query.ToList(), new { id = 0, Title = string.Empty });
var query = pro.types.Select(ty => new
{
typID = ty.type_id,
typ_nam = ty.type_nam,
cat_names = ty.categories.Select(cat => new
{
catgID = cat.cat_id,
catg_name = cat.cat_nam,
items = pro.items.Select(itm => new
{
item_ID = itm.item_id,
item_nam = itm.item_nam,
item_path = itm.url,
coments = pro.comments.Select(cmm => new
{
comm_title = cmm.comment_nam,
comm_mail = cmm.mail,
comm_text = cmm.text,
})
})
})
}).ToList();
bool l = myfunc(query);
protected bool myfunc(object q)
{
var cquery = CreateGenericListFromAnonymous(q,
new
{
typID = 0,
typ_nam = string.Empty,
cat_names = CreateEmptyAnonymousIEnumerable(new
{
catgID = 0,
catg_name = string.Empty,
items = CreateEmptyAnonymousIEnumerable(new
{
item_ID = 0,
item_name = string.Empty,
item_path = string.Empty,
coments = CreateEmptyAnonymousIEnumerable(new
{
comm_title = string.Empty,
comm_mail = string.Empty,
comm_text = string.Empty,
})
})
})
});
foreach (var item in cquery)
{
int ID = item.typID;
string type_title = item.typ_nam;
foreach (var Cname in item.cat_names)
{
int categoryID = Cname.catgID;
string category_name = string.Empty;
foreach (var Iname in Cname.items)
{
int ItmID = Iname.item_ID;
string ItmName = Iname.item_name;
string ItmPath = Iname.item_path;
foreach (var cm in Iname.coments)
{
string com_title = cm.comm_title;
string com_mail = cm.comm_mail;
string com_text = cm.comm_text;
}
}
}
}
return true;
}IList<Types> typesList = context.Types.Include(x=>x.Categories)
.Include(x=>x.Items).Include(x=>x.Comments).ToList();