I hope you are well. Is it possible to query the LazyCache cache using Linq?
// Initialize Class
retVal = (ModelXyz)MemoryCache.Default.Where(u => (u.Value is ModelXyz) &&
(u.Value as ModelXyz).Property1 == abc &&
(u.Value as ModelXyz).Property2 == cde &&
(u.Value as ModelXyz).Property3 == true).Select(x => x.Value).FirstOrDefault();
Related
Is there any difference in performance for linq in following case:
db.Table1.Where(p=>p.Item == 2).Join(db.Table2).Where(pq => q.Item == 3).Join(db.Table3).Where(pqr.r.Item == 3)
vs
db.Table1.Join(db.Table2).Join(db.Table3).Where(pqr => pq.p.Item == 2 && pqr => pq.q.Item == 3 && pqr.r.Item == 3)
I am trying to get all #events where that have a FiscalYear.id inIList<int> years. I am using any() but it is throwing the following stacktrace error:
Unrecognised method call:
System.Linq.Enumerable:Boolean Any[TSource](System.Collections.Generic.IEnumerable`1[TSource], System.Func`2[TSource,System.Boolean])
Any Ideas? Here is the code:
FindAllPaged(int eventTypeId, IList<int> aors, IList<int> years)
{
IList<Domain.Event> results =
session.QueryOver<Event>()
.Where(#event => !#event.IsDeleted &&
#event.EventType.Id == eventTypeId &&
years.Any(y => y == #event.FiscalYear.Id))
}
Looks like you are trying to use a Linq method in QueryOver. This isn't supported. Try using the Linq provider instead:
FindAllPaged(int eventTypeId, IList<int> aors, IList<int> years)
{
IList<Domain.Event> results =
session.Query<Event>()
.Where(#event => !#event.IsDeleted &&
#event.EventType.Id == eventTypeId &&
years.Any(y => y == #event.FiscalYear.Id))
}
I also encountered the same exception message
Unrecognised method call:
System.Linq.Enumerable:Boolean Any[TSource](System.Collections.Generic.IEnumerable1[TSource], System.Func2[TSource,System.Boolean])
when using IqueryOver with Contains method
Ex:
var departmentTypesArray = criteria.DepartmentTypes.ToArray();
qover = qover.Where(p => departmentTypesArray.Contains(p.DepartmentType));
when i check the database, i don't have any records inside the table that i am making query.
when i changed my query with Restrictions, then it works for me
qover = qover.WhereRestrictionOn(p => .DepartmentType).IsIn(departmentTypesArray);
Try using the Contains method instead:
IList<Domain.Event> results = session
.QueryOver<Event>()
.Where(e => !#event.IsDeleted &&
#event.EventType.Id == eventTypeId &&
years.Contains(#event.FiscalYear.Id))
.ToList();
Or build your restrictions the long way using IsIn:
IList<Domain.Event> results = session
.QueryOver<Event>()
.Where(e => !#event.IsDeleted && #event.EventType.Id == eventTypeId)
.And(Restrictions.On<Event>(#event => #event.FiscalYear.Id)
.IsIn(years.ToArray()))
.ToList();
You could try this:
IList<Domain.Event> results = session.QueryOver<Event>().ToList().FindAll(e => !e.IsDeleted && e.Id.Equals(eventTypeId) && years.Contains(e.FiscalYear.Id))
How can I convert the LINQ query below using LAMBDA Expressions ?
var select = from si in db.San_Imovel
join sic in db.San_Imovel_caracteristica
on si.Imovel_Id equals Convert.ToInt64(sic.Imovel_Id)
join sf in db.San_Filial
on si.Credenciada_Id equals sf.Credenciada_Id
where si.Credenciada_Id == credenciada_Id
&& (si.GrupoImovel_Id.ToString().Contains("1") || si.GrupoImovel_Id.ToString().Contains("2"))
&& (si.Status_Id.ToString().Contains("1") || si.Status_Id.ToString().Contains("12"))
&& si.NomeArquivo != null
&& (si.Imovel_Id.ToString().Contains(""))
select new
{
si.Celula_Id,
si.Credenciada_Id,
si.Imovel_Id,
si.NomeArquivo,
si.TipoDsc1,
si.BairroDsc1,
si.AreaRealPrivativa,
sic.VagasGaragem,
si.ValorImovel,
si.ValorCondominio,
si.ValorIPTU,
si.Lat2,
si.Lon2,
sf.ApelidoCredenciada,
sf.ddd,
sf.TelefoneVenda,
sf.TelefoneLocacao,
sf.Email,
si.Bairro1,
si.NomeCidade,
si.Transacao_ID
};
var query =
db.San_Imovel
.Join(db.San_Imovel_caracteristica,
si => Imovel_Id,
sic => Convert.ToInt64(sic.Imovel_Id),
(si, sic) => new { si, sic })
.Join(db.San_Filial,
x => x.si.Credenciada_Id,
sf => sf.Credenciada_Id,
(x, sf) => new { x.si, x.sic, sf })
.Where(x => x.si.Credenciada_Id == credenciada_Id &&
(x.si.GrupoImovel_Id.ToString().Contains("1") ||
x.si.GrupoImovel_Id.ToString().Contains("2")) &&
(x.si.Status_Id.ToString().Contains("1") ||
x.si.Status_Id.ToString().Contains("12")) &&
x.si.NomeArquivo != null &&
(x.si.Imovel_Id.ToString().Contains(""))
.Select(x => new {
x.si.Celula_Id,
x.si.Credenciada_Id,
x.si.Imovel_Id,
x.si.NomeArquivo,
x.si.TipoDsc1,
x.si.BairroDsc1,
x.si.AreaRealPrivativa,
x.sic.VagasGaragem,
x.si.ValorImovel,
x.si.ValorCondominio,
x.si.ValorIPTU,
x.si.Lat2,
x.si.Lon2,
x.sf.ApelidoCredenciada,
x.sf.ddd,
x.sf.TelefoneVenda,
x.sf.TelefoneLocacao,
x.sf.Email,
x.si.Bairro1,
x.si.NomeCidade,
x.si.Transacao_ID
});
BTW you don't need to convert whole query to method syntax. You can convert only filtering where part.
I'm busy rewriting a system and are using Linq queries to extract data from the database. I am used to plain old TSQL and stored procedures so my Linq skills are not the best.
I have a sql query that I try to rewrite in Linq that contains a join, where clause and IN statements. I do get it right but when I run the sql query I get a different value as from the Linq query. Somewhere I'm missing something and can't find the reason.
Here is the SQL:
select
isnull(Sum(QtyCC) + Sum(QtyEmployee), 0) *
isnull(Sum(UnitPrice), 0)[TotalRValue]
from
tbl_app_KGCWIssueLines a
inner join tbl_app_KGCWIssue b on b.IssueNrLnk = a.IssueNrLnk
where
b.CreationDate >= '2011-02-01' and
a.IssueNrLnk IN (
select
IssueNrLnk
from
tbl_app_KGCWIssue
where
CustomerCode = 'PRO002' and
ISNULL(Tier1,'') = 'PRO002' and
ISNULL(Tier2,'') = 'HAMD01' and
ISNULL(Tier3,'') = '02' and
ISNULL(Tier4,'') = '02001' and
ISNULL(Tier5,'') = 'PTAHQ001' and
ISNULL(Tier6,'') = '035' and
ISNULL(Tier7,'') = '' and
ISNULL(Tier8,'') = '' and
ISNULL(Tier9,'') = '' and
ISNULL(Tier10,'') = ''
)
And here is the Linq:
ctx.ObjectContext.tbl_app_KGCWIssue
.Join(ctx.ObjectContext.tbl_app_KGCWIssueLines,
i => i.IssueNrLnk, l => l.IssueNrLnk, (i, l) => new { i, l })
.Where(o => o.i.CreationDate >= IntervalStartDate)
.Where(p => ctx.ObjectContext.tbl_app_KGCWIssue
.Where(a =>
a.CustomerCode == CustomerCode &&
a.Tier1 == employee.Tier1 &&
a.Tier2 == employee.Tier2 &&
a.Tier3 == employee.Tier3 &&
a.Tier4 == employee.Tier4 &&
a.Tier5 == employee.Tier5 &&
a.Tier6 == employee.Tier6 &&
a.Tier7 == employee.Tier7 &&
a.Tier8 == employee.Tier8 &&
a.Tier9 == employee.Tier9 &&
a.Tier10 == employee.Tier10)
.Select(i => i.IssueNrLnk)
.Contains(p.l.IssueNrLnk))
.Sum(p => p.l.UnitPrice * (p.l.QtyEmployee + p.l.QtyCC));
I'm trying to construct a Linq statement to be used from a client with the Sharepoint (2010) object model.
This is the problematic piece of code:
var result = news.Where(n => (bool)n["Online"]
&& ((DateTime)n["StartDate"] <= DateTime.Now && (DateTime)n["StopDate"] >= DateTime.Now));
if (currentUser.IsAgUser())
result = result.Where(n => (string)n["Role"] != "AG-ADMIN");
var filteredNews = sharepointContext.LoadQuery(result);
When the if parte is executed and so another Where is added to result, I get the followin error when LoadQuerying it.
The query expression 'value(Microsoft.SharePoint.Client.ListItemCollection).Where(n => (Convert(n.get_Item("Online")) AndAlso ((Convert(n.get_Item("StartDate")) <= DateTime.Now) AndAlso (Convert(n.get_Item("StopDate")) >= DateTime.Now)))).Where(n => (Convert(n.get_Item("Role")) != "AG-ADMIN"))' is not supported.
Where is the error coming from? Thanks
It seems like SharePoint doesn't support several wheres.
Cheap solution:
var result = currentUser.IsAgUser()
? news.Where(n => (bool)n["Online"]
&& ((DateTime)n["StartDate"] <= DateTime.Now && (DateTime)n["StopDate"] >= DateTime.Now) && (string)n["Role"] != "AG-ADMIN")
: news.Where(n => (bool)n["Online"]
&& ((DateTime)n["StartDate"] <= DateTime.Now && (DateTime)n["StopDate"] >= DateTime.Now));
var filteredNews = sharepointContext.LoadQuery(result);